<?php
/**************************************
 * Mysql Class
 * Brainfucker.ru (c) Oleg Illarionov
 **************************************/

# для совместимости с 4 php функции array_walk_recursive
#include_once engine.'/php4/array_walk_recursive.php';

class mysql {
	# указатель для работы с БД
	var $handle=null;
	# обозначение знака заменяемого на подставляемые элементы 
	var $separator='$';
	# обозначение знака заменяемого на префикс 
	var $prefixsimbol='~';
	# префикс таблиц в БД
	var $prefix='we_';
        
	/** 
	 * Конструктор
	 * @param array() либо $host,$username,$password,$dbname,$prefix
	 * @return
	 */
	function mysql() {
		$param=func_get_args();
		if (count($param) > 1) {
			$conn['host']=$param[0];
			$conn['username']=$param[1];
			$conn['password']=$param[2];
			$conn['dbname']=$param[3];
			if (isset($param[4])) $conn['prefix']=$param[4];
		} else {
			$conn=$param[0];
		}
		$this->handle=mysql_connect($conn['host'],$conn['username'],$conn['password']);
		if (!$this->handle || !mysql_select_db($conn['dbname'],$this->handle)) {
			die('[ERROR] mysql: '.mysql_error());
		}
		mysql_query('SET NAMES utf8',$this->handle);
		if (isset($conn['prefix'])) {
			if (!empty($conn['prefix'])) $this->prefix=$conn['prefix'].'_';
			else $this->prefix='';
		}
	}
	
	/**
	 * Защищает строку от инъекций
	 * @param string $str
	 * @return string $str
	 */
	function escape(&$str) {
		if(!is_numeric($str) && !is_bool($str) && $str!='NOW()')
			$str='"'.mysql_escape_string($str).'"';
		if (is_bool($str)) 
			$str = ($str==true)?'true':'false';
	}
	
	/**
	 * Запрос к бд
	 * @param string $sql
	 * @param $param1
	 * @param $param2
	 * @param ...
	 * @return query
	 */
	function queryResult() {
		$param=func_get_args();
		if (is_array($param[0])) {
			$param=$param[0];
		}
		$sql=$param[0];
		unset($param[0]);
		array_walk_recursive($param,'mysql::escape');
		$sql=str_replace($this->separator,"%s",str_replace($this->prefixsimbol,$this->prefix,$sql));
		$sql=vsprintf($sql,$param);
		if (defined('mysql_debug')) {
			mysql_debug_add_sql($sql);
		}
		$res=mysql_query($sql,$this->handle);
		if ($res) {
			return $res;
		} else {
			$this->error($sql);
		}
	}
	
	/**
	 * Выполнение набора запросов разделённых ";"
	 * @param string $sql
	 * @param $param1
	 * @param $param2
	 * @param ...
	 * @return array
	 */
	function query() {
		$args=func_get_args();
		if (!empty($args[0])) {
			$sqls=explode(';', $args[0]);
			unset($args[0]);
			foreach ($sqls as $sql) {
				if (!empty($sql)) {
					$res = $this->queryResult($sql);
					$out[] = $res;
				}
			}
		}
		if (count($out)==1) $out=$out[0];
		return $out;
	}
	
	/**
	 * Получение количества полей
	 * @return количество полученных полей
	 */
	function rowCount() {
		return mysql_num_rows($this->queryResult(func_get_args()));
	}
	
	
	function count($table,$where = '') {
		if (!empty($where)) $where=' WHERE '.$where;
		return $this->fetchOne('SELECT COUNT(*) FROM `'.$this->prefix.$table.'`'.$where);
	}
	
	/**
	 * получение строчки из базы данных
	 * @param string $sql
	 * @param $param1
	 * @param $param2
	 * @param ...
	 * @return array
	 */
	function fetchRow() {
		return mysql_fetch_assoc($this->queryResult(func_get_args()));
	}
	
	/**
	 * получение всех строчек из базы данных
	 * @param string $sql
	 * @param $param1
	 * @param $param2
	 * @param ...
	 * @return array
	 */
	function fetchAll() {
		$res = $this->queryResult(func_get_args());
		while ($row = mysql_fetch_assoc($res)) {
			$out[] = $row;
		}
		return $out;
	}
	
	/**
	 * получение единственного элемента из выборки
	 * @param string $sql
	 * @param $param1
	 * @param $param2
	 * @param ...
	 * @return val
	 */
	function fetchOne() {
		$res = $this->queryResult(func_get_args());
		return @mysql_result($res,0);
	}
	
	/**
	 * Добавление строки в таблицу
	 * @param string $tableName
	 * @param $param1 or $array
	 * @param $param2
	 * @param ...
	 * @return bool
	 */
	function insert($tableName) {
		$param=func_get_args();
		unset($param[0]);
		array_walk_recursive($param,'mysql::escape');
		if (!empty($this->prefix)) $tableName=$this->prefix.$tableName;
		if (is_array($param[1])) {
			$sql = 'INSERT INTO `'.$tableName.'` (`'.implode('`, `',array_keys($param[1])).'`) VALUES ('.implode(',',array_values($param[1])).')';
		} else {
			$sql = 'INSERT INTO `'.$tableName.'` VALUES ('.implode(',',$param).')';
		}
		if (defined('mysql_debug')) {
			mysql_debug_add_sql($sql);
		}
		if (!mysql_query($sql,$this->handle)) $this->error($sql);
		return mysql_insert_id($this->handle);
	}
	
	/**
	 * Проверка наличия элемента в БД
	 * @param string $tableName
	 * @param array $args
	 * @param string $condition
	 * @return bool
	 */
	function check($tableName, $args, $condition='') {
		array_walk_recursive($args,'mysql::escape');
		foreach ($args as $key=>$val) {
			$arr[]='`'.$key.'`='.$val;
		}
		if (!empty($condition)) $condition=' AND '.str_replace($this->prefixsimbol,$this->prefix,$condition);
		$sql = 'SELECT COUNT(*) FROM `'.$this->prefix.$tableName.'` WHERE '.implode(' AND ',$arr).$condition.' LIMIT 1';
		if (defined('mysql_debug')) {
			mysql_debug_add_sql($sql);
		}
		$res = mysql_query($sql,$this->handle);
		return @mysql_result($res,0);
	}
	
	/**
	 * Возвращает id добавленного в бд элемента
	 *
	 * @return int insertion_id
	 */
	function insertId() {
		return mysql_insert_id($this->handle);
	}
	
	/**
	 * Изменение строки в таблице
	 * @param string $tableName
	 * @param array $args
	 * @param string $condition
	 * @return bool
	 */
	function update($tableName, $args, $condition='') {
		array_walk_recursive($args,'mysql::escape');
		foreach ($args as $key=>$val) {
			$arr[]='`'.$key.'`='.$val;
		}
		$sql = 'UPDATE `'.$this->prefix.$tableName.'` SET '.implode(', ',$arr).' WHERE '.str_replace($this->prefixsimbol,$this->prefix,$condition);
		if (defined('mysql_debug')) {
			mysql_debug_add_sql($sql);
		}
		if (mysql_query($sql,$this->handle)) {
			return true;
		} else {
			$this->error($sql);
		}
	}
	
	/**
	 * Удалить строки из таблицы
	 *
	 * @param string $tableName
	 * @param mixed $cond
	 * @return bool
	 */
	function delete($tableName, $cond) {
		if (is_numeric($cond)) $cond='`id`='.$cond;
		$sql='DELETE FROM `'.$this->prefix.mysql_escape_string($tableName).'` WHERE '.$cond;
		if (defined('mysql_debug')) {
			mysql_debug_add_sql($sql);
		}
		return mysql_query($sql,$this->handle);
	}
	/**
	 * возвращает текст ошибки
	 *
	 * @param str $sql
	 */
	function error($sql='') {
		if (defined('mysql_debug')) {
			print_sql_error(mysql_error($this->handle),$sql);
		} else {
			echo '<br />Функция временно недоступна<br />';
		}
	}
}
?>